<?php

/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

namespace EasyActionPHP\Controller;

/**
 * HttpRequest - Representa as requisições lançadas pelo Navegador.
 *
 * @author Flavio de Vasconcellos Correa
 * @since 2007/06/04
 * @package EasyActionPHP
 * @subpackage Controller
 * @version $id$
 * @license http://www.gnu.org/copyleft/gpl.html GPL
 */
class HttpRequest {

    /**
     * @staticvar HttpRequest singleton instancia desta classe.
     */
    static $instance;

    /**
     * Retorna a instancia singleton desta classe.
     *
     * @access public
     * @return HttpRequest
     */
    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new HttpRequest();
        }
        return self::$instance;
    }

    /**
     * Altera ou atribui valor a um atributo GET
     * 
     * @param type $attr
     * @param type $value
     */
    public static function setAttribute($attr, $value) {
        $_GET[$attr] = $value;
    }

    /**
     * Retorna o valor associado a uma atribudo GET.
     *
     * @access public
     * @return String
     */
    public static function getAttribute($attr) {
        return $_GET[$attr];
    }

    /**
     * Retorna uma lista associada a todos os atributos passados via GET.
     *
     * @access public
     * @return Array[GET_NAME, GET_VALUE]
     */
    public static function getAttributes() {
        return $_GET;
    }

    /**
     * Retorna o valor associado a uma propriedade POST.
     *
     * @access public
     * @return String
     */
    public static function getPropertie($name) {
        return $_POST[$name];
    }

    /**
     * Retorna uma lista associada a todas as propriedades passados via POST.
     *
     * @access public
     * @return Array[POST_NAME, POST_VALUE]
     */
    public static function getProperties() {
        return $_POST;
    }

    /**
     * Retorna a sessão corrente.
     *
     * @access public
     * @return Array
     */
    public static function getSession() {
        return $_SESSION;
    }

    public static function setCookie() {
        
    }

    /**
     * Inicia uma sessão no servidor.
     *
     * @access public
     * @return void
     */
    public static function startSession() {
        @session_start();
    }

    /**
     * Encerra uma sessão no servidor.
     *
     * @access public
     * @return void
     */
    public static function destroySession() {
        @session_destroy();
    }

    /**
     * Associa na sessão um valor.
     *
     * @access public
     * @param String name
     * @param Mixed
     * @return void
     */
    public static function setSessionParameter($name, $value) {
        if (is_object($value))
            $value = serialize($value);
        $_SESSION[$name] = $value;
    }

    /**
     * Retorna um valor associado da sessão.
     *
     * @param String name
     */
    public static function getSessionParameter($name) {
        $value = $_SESSION[$name];
        //if(!isset($value)) return null;
        $object = @unserialize($value);
        if ($object === false) {
            return $value;
        } else {
            return $object;
        }
    }

    /**
     * Retorna TRUE se a requisição foi um GET.
     *
     * @access public
     * @return Boolean
     */
    public static function isGet() {
        return self::get('REQUEST_METHOD') == 'GET';
    }

    /**
     * Retorna TRUE se a requisição foi um POST.
     *
     * @access public
     * @return Boolean
     */
    public static function isPost() {
        return self::get('REQUEST_METHOD') == 'POST';
    }

    /**
     * Retorna uma variável associada do servidor ou do ambiente.
     *
     * @access private
     * @return String
     */
    private static function get($key) {
        return isset($_SERVER[$key]) ? $_SERVER[$key] : (@getenv($key) ? getenv($key) : null);
    }

    /**
     * Retorna a URI corrente.
     *
     * @access public
     * @return String
     */
    public static function getCurrentURI($removeGets = null) {
        $attrs = self::getAttributes();
        if (is_array($removeGets)) {
            $output = $_SERVER['PHP_SELF'];
            $first = true;
            foreach ($attrs as $attrName => $attrValue) {
                if (!in_array($attrName, $removeGets)) {
                    $output .= ($first ? '?' : '&') . $attrName . '=' . $attrValue;
                    $first = false;
                }
            }
        } else {
            $output = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
        }
        return $output;
    }

}

?>